import axios from 'axios'
import {getToken} from '@/utils/auth'
import nProgress from 'nprogress'

const baseURL = import.meta.env.MODE === 'dev' ? '' : import.meta.env.VITE_APP_BASE_API
/* 构建axios请求 */
const axiosRequest = axios.create({
    // 设置代理 ‘/api’ 为代理规则 代理到target 也就是后端地址 http://localhost:8080 也可以是其他地址 如 http://www.baidu.com 但是要注意跨域问题
    // 如baseURL: '/api'，请求地址为 http://localhost:8080/api/xxx
    baseURL: baseURL + '/api',
    // 请求超时时间
    timeout: 5000
})

// 在request前处理
axiosRequest.interceptors.request.use(function (config) {
    // config配置对象，有一个属性很重要，就是header请求头
    nProgress.start()
    // 在发送请求之前做些什么
    if (getToken()) {
        config.headers.Authorization = getToken() || '' // 添加头部
    }
    // console.log('请求API',config.url)
    // console.log('请求方式',config.method)
    // console.log('请求头',config.headers['Authorization'])
    // console.log('请求参数',config.data ? config.data : 'null')
    return config
}, function (error) {
    if (error.response && error.response.status === 404) {
        console.log('请求地址不存在！'); // 请求地址不存在
        return new Promise((resolve) => {
            resolve(error.response)
        })
    }
    // 处理请求错误
    return Promise.reject(error)
})

/* 重写axios的响应类型 */
declare module 'axios' {
    interface AxiosResponse<T>{
        code: number,
        data: T;
        msg: string
    }
    // export function create(config?: AxiosRequestConfig): AxiosInstance;
}

// 响应拦截器
axiosRequest.interceptors.response.use((res) => {
    nProgress.done()
    // 成功的回调函数：服务器响应数据回来以后，响应拦截器可以检测到，可以做一些事
    // 这里是当res.headers.authorization存在时，将其赋值给res.data.msg
    if (res.headers.authorization) {
        res.data.msg = res.headers.authorization
    }
    // console.log('请求数据')
    // console.log(res.data)
    return res.data
    // return res
}, function (error) {
    // 失败的回调函数：服务器响应数据回来以后，响应拦截器可以检测到，可以做一些事情
    if (error.response && error.response.status === 401) {
        console.log(error.response.data.msg)
        return new Promise((resolve) => {
            resolve(error.response)
        })
    } else if (error.response && error.response.status === 403) {
        if (getToken() != null) {
            console.log('权限不足')
            return new Promise((resolve, reject) => {
                resolve(error.response)
                reject(error.response)
            })
        }
        window.location.href = '/#/login'
        return new Promise((resolve, reject) => {
            resolve(error.response)
            reject(error.response)
        })
    }
    return Promise.reject(error)
})

export default axiosRequest
